/* pokreni.S - pokreni podizanje sustava */
     
/* da bi 'grub' 'znao' radit sa 'nasim' sustavom moramo stavit neke
   brojke koje on trazi	
 */
#define MULTIBOOT_HEADER_MAGIC		0x1BADB002
#define MULTIBOOT_HEADER_FLAGS		0x00000003
#define VELICINA_STOGA			0x8000

/* kad se povezivaju funcije asembler <--> C zna bit problema u
   imenovanju funkcija (labela), ovisno o prevodiocu/linkeru
 */
#ifdef HAVE_ASM_USCORE
# define EXT_C(sym)                     _ ## sym
#else
# define EXT_C(sym)                     sym
#endif

/* 'D' pocetak */
.section .pocetak_koda
	
.global  start

	/* Poravnaj na 32-bitovnu granicu */
	.align  4
	
	/* Multiboot zaglavlje */
multiboot_zaglavlje:
	/* magicni broj */
	.long   MULTIBOOT_HEADER_MAGIC
	/* zastavice */
	.long   MULTIBOOT_HEADER_FLAGS
	/* zastita */
	.long   -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

start:
	/* Inicijalizacija kazaljke stoga */
	movl    $(stog + VELICINA_STOGA), %esp
	
	/* Resetiranje zastavica - EFLAGS  registra stanja */
	pushl   $0
	popf
	
	/* Stavi na stog kazaljku na Multiboot strukturu */
	pushl   %ebx
	/* Stavi na stog "magicni broj" */
	pushl   %eax
	
	/* Pozovi C funkciju */
	call    EXT_C(pozdrav_svima)
	addl	$8, %esp
	
	/* Ispisi zadnju poruku */
	pushl   $zadnja_poruka
	call    EXT_C(ispisi_rijec)
	addl	$4, %esp
	
	/* zaustavi sustav */
loop:   hlt
	jmp     loop
	
zadnja_poruka:
	.asciz  "To je bilo to!"
	
	/* Mjesto za stog */
	.align 4
	.comm   stog, VELICINA_STOGA
